<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>



    // Promise根据异步操作结果改变状态 
    // debugger;   // 同步代码执行时停下了
    var p = new Promise(function (resolve, reject) { // F11
        // (1) 构造函数Promise要求接收一个回调函数(所谓的容器),常用于接收异步操作(同步也可以)
        // (2) 接收的回调函数(容器)属于同步任务,在new Promise() 创建实例化对象过程中立即执行
        // (3) 回调函数的两个参数分别是resolve和reject(形参)。它们是两个函数，由 JavaScript 引擎提供，不用自己部署 (用于改变Promise实例的状态)

        console.log("Promise接收的的回调函数执行了");



        //  new Promise() 接收的回调函数执行过程中,发生错误(同步操作)  => new Promise()内部存在异常捕获机制(try...catch), 错误并不会被直接抛出, 而是把Promise实例变为已失败状态,并把错误的元素作为Promise实例的数据存储
        // aaaa;  // 报错!!   aaaa is not defined!   // p  {<rejected>:err}

        // 异步代码执行时出错,  并不能被new Promise()内部存在异常捕获机制捕获到 => 等异步任务执行时,手动添加异常捕获
        setTimeout(() => {
            try {
                aaaa;  // 报错!!   aaaa is not defined! 
            } catch (err) {
                reject(err);
            }
        }, 1000)


        // catch演示  => Promise实例变为已成功,不做任何操作, Promise实例变为已失败,执行catch内的回调函数
        // 投硬币 (根据异步操作结果)
        // setTimeout(() => {   // F10
        //     // debugger;   //异步代码执行时停下了
        //     var num = 0.1;

        //     // 根据异步操作的结果, 自行决定如何改变状态 => 演示
        //     if (num > 0.5) { // 正面(不拖堂)
        //         resolve("老王不拖堂");  // {<fulfilled>:"老王不拖堂"}
        //     } else {  // 反面
        //         reject("老王拖堂了"); // {<rejected>: "老王拖堂了"}
        //     }
        //     console.log("异步任务执行了:" + num, p);
        // }, 2000);



    });
    console.log(1111, p);  //  {<pending>:undefined}



    /* 
       Promise实例的方法:  官方提供,专门供Promise实例使用的方法

       语法:   Promise实例.方法();
   
        
       then(resolveHandler,rejectHandler)   Promise实例生成以后，可以用then方法分别指定resolved状态和rejected状态的回调函数。
       resolveHandler  回调函数,当Promise实例由pending(进行中)变为fulfilled(已成功)执行此回调函数
       rejectHandler   回调函数,当Promise实例由pending(进行中)变为rejected(已失败)执行此回调函数

       resolveHandler()/rejectHandler()  两个函数是可选的
       resolveHandler()/rejectHandler() 都有一个形式参数,用于接收Promise实例中存储的数据(new Promise()中resolve和reject方法传递的数据)

       注意: 
        then()方法调用时,异步操作还没有执行,所以可以理解为then()提前制定了状态改变之后要执行的内容(回调函数),等异步操作有结果,Promise实例状态改变之后对应执行回调函数

        catch  方法是.then(null, rejection)或.then(undefined, rejection)的别名，用于指定发生错误时的回调函数(Promise实例变为rejected状态,执行catch对应的回调函数)。

        有哪些操作,可以将Promise实例的状态变为rejected(已失败)
        (1) new Promise() 接收的回调函数执行过程中,发生错误(同步操作)  => new Promise()内部存在异常捕获机制(try...catch), 错误并不会被直接抛出, 而是把Promise实例变为已失败状态,并把错误的元素作为Promise实例的数据存储
        (2) 调用 new Promise()中提供的reject()方法  可以将Promise实例的状态变为rejected


   
   */


    p.catch(function (arg) {
        console.log("rejected", arg);
    })

    // 等价于
    // p.then(null, function (arg) {
    //     console.log("rejected", arg);
    // })

    console.log("主线程所有同步代码执行完毕!");



</script>

</html>